package com.aliyun.openservice.iot.as.bridge.demo.core;

import java.util.Map;

import com.aliyun.iot.as.bridge.core.BridgeBootstrap;
import com.aliyun.iot.as.bridge.core.config.ConfigFactory;
import com.aliyun.iot.as.bridge.core.config.DeviceConfigManager;
import com.aliyun.iot.as.bridge.core.handler.DownlinkChannelHandler;
import com.aliyun.iot.as.bridge.core.model.DeviceIdentity;
import com.aliyun.iot.as.bridge.core.model.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 演示如何使用自定义配置的Bridge网关示例类
 */
public class BridgeSelfDefineConfigDemo {

    // 日志记录器
    private static Logger log = LoggerFactory.getLogger(BridgeSelfDefineConfigDemo.class);

    // Bridge引导程序
    private static BridgeBootstrap bridgeBootstrap;

    // 存储设备标识的映射
    private static Map<String, DeviceIdentity> devicesMap;

    public static void main(String args[]) {
        // 自定义配置
        // 你可以指定配置文件的位置路径
        // 或者你可以创建一个实例并实现相应的接口
        // 注意：Config.init() 必须在 bridgeBootstrap.bootstrap() 之前调用
        ConfigFactory.init(
            ConfigFactory.getBridgeConfigManager("application-self-define.conf"),
            selfDefineDeviceConfigManager);

        // 启动Bridge，并设置下行通道处理器
        bridgeBootstrap.bootstrap(new DownlinkChannelHandler() {
            @Override
            public boolean pushToDevice(Session session, String topic, byte[] payload) {
                // 从云端获取下行消息，不要在这里阻塞
                String content = new String(payload);
                log.info("获取到下行消息, 会话:{}, 主题:{}, 内容:{}", session, topic, content);
                return true;
            }

            @Override
            public boolean broadcast(String s, byte[] bytes) {
                // 广播功能未实现
                return false;
            }
        });
        log.info("======== Bridge 引导成功 =========");
    }

    // 自定义设备配置管理器
    private static DeviceConfigManager selfDefineDeviceConfigManager = new DeviceConfigManager() {
        @Override
        public DeviceIdentity getDeviceIdentity(String originalIdentity) {
            // 假设你通过其他方式动态获取设备信息
            return devicesMap.get(originalIdentity);
        }

        @Override
        public String getOriginalIdentity(String productKey, String deviceName) {
            // 你可以忽略这个方法
            return null;
        }
    };

}
